#define _CRT_SECURE_NO_WARNINGS
// -------------------------------------------------------------
// 学籍管理系统 - 主函数框架
// -------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "SlinkNode.h" // 包含链表操作相关的头文件
#include <stdbool.h>   // 确保包含了 bool 类型库

// --- 辅助函数：显示菜单 ---
void showMenu() {
    printf("\n==================================\n");
    printf("     学生学籍管理系统 (C语言链表版) \n");
    printf("==================================\n");
    printf("  1. 添加学生 (头插法)\n");
    printf("  2. 显示所有学生\n");
    printf("  3. 按学号查询学生\n");
    printf("  4. 按姓名查询学生\n");
    printf("  5. 按学号删除学生\n");
    printf("  6. 按学号修改学生信息\n");
    printf("  7. 统计学生总数\n");
    // printf("  8. 保存数据到文件\n"); // (高级功能)
    printf("  0. 退出系统\n");
    printf("==================================\n");
    printf("请输入你的选择 (0-7): ");
}


// --- 主函数入口 ---
int main()
{
    int choice = -1;
    LinkList L = Initial(); // 1. 初始化系统

    ElemType tempStudent;  // 用于临时存储用户输入
    int tempId;
    char tempName[15];
    Lnode* pNode = NULL;

    printf("--- 学籍管理系统启动成功 ---\n");
    printf("--- 请选择您需要的操作 ---\n");
    
    // 2. (高级) 尝试从文件加载数据
    // LoadFromFile(L, "students.dat"); 

    while (choice != 0)
    {
        showMenu(); // 3. 显示菜单

        // 4. 获取用户选择 (只取一个数字)
        if (scanf("%d", &choice) != 1) {
            printf("输入无效，请输入0-7之间的数字！\n");
            clear_input_buffer(); // 清空错误输入
            continue; // 继续下一次循环
        }
        clear_input_buffer(); // 清空 scanf 留下的换行符

        // 5. 根据选择执行操作
        switch (choice)
        {
        case 1: // 添加学生 (头插法)
            printf("--- [1. 添加学生] ---\n");
            printf("请输入学号: ");
            scanf("%d", &tempStudent.Id);
            clear_input_buffer();

            // **关键**: 检查学号是否已存在
            if (FindId(L, tempStudent.Id) != NULL) {
                printf("错误：学号 %d 已存在，添加失败！\n", tempStudent.Id);
                break;
            }

            printf("请输入姓名: ");
            scanf("%14s", tempStudent.Name); // %14s 防止溢出
            clear_input_buffer();

            printf("请输入年龄: ");
            scanf("%d", &tempStudent.age);
            clear_input_buffer();

            // 调用你已写好的函数
            if (HeadInsert(L, tempStudent)) {
                printf("学生 %s 添加成功！\n", tempStudent.Name);
            }
            else {
                printf("添加失败！(可能是内存不足)\n");
            }
            break;

        case 2: // 显示所有学生
            printf("--- [2. 显示所有学生] ---\n");
            // 调用你已写好的函数
            displayslink(L);
            break;

        case 3: // 按学号查询
            printf("--- [3. 按学号查询] ---\n");
            printf("请输入要查询的学号: ");
            scanf("%d", &tempId);
            clear_input_buffer();

            // 调用你已写好的函数
            pNode = FindId(L, tempId);
            if (pNode != NULL) {
                printf("找到了！\n学号：%d\t姓名：%s\t年龄：%d\n",
                    pNode->date.Id, pNode->date.Name, pNode->date.age);
            }
            else {
                printf("未找到学号为 %d 的学生。\n", tempId);
            }
            break;

        case 4: // 按姓名查询
            printf("--- [4. 按姓名查询] ---\n");
            printf("请输入要查询的姓名: ");
            scanf("%14s", tempName);
            clear_input_buffer();

            // 调用你已写好的函数
            pNode = FindName(L, tempName);
            if (pNode != NULL) {
                printf("找到了第一个匹配的学生：\n学号：%d\t姓名：%s\t年龄：%d\n",
                    pNode->date.Id, pNode->date.Name, pNode->date.age);
                // 提示: 更好的做法是写一个新函数来遍历并打印所有同名学生
            }
            else {
                printf("未找到姓名为 '%s' 的学生。\n", tempName);
            }
            break;

        case 5: // 按学号删除
            printf("--- [5. 按学号删除] ---\n");
            printf("请输入要删除的学号: ");
            scanf("%d", &tempId);
            clear_input_buffer();

            // **注意**：这里需要你实现 DelNodeByID 函数
            // (你现有的 DelNodeW 是按位置删除，不适合这里)
            if (DelNodeByID(L, tempId)) {
                printf("学号 %d 删除成功！\n", tempId);
            }
            else {
                printf("删除失败！未找到该学号。\n");
            }
            break;

        case 6: // 按学号修改
            printf("--- [6. 按学号修改] ---\n");
            printf("请输入要修改的学生的学号: ");
            scanf("%d", &tempId);
            clear_input_buffer();

            // **注意**：这里需要你实现 UpdateStudentByID 函数
            if (UpdateStudentByID(L, tempId)) {
                printf("修改成功！\n");
            }
            else {
                printf("修改失败！未找到该学号。\n");
            }
            break;

        case 7: // 统计总数
            printf("--- [7. 统计学生总数] ---\n");

            // **注意**：这里需要你实现 GetLength 函数
            int count = GetLength(L);
            printf("当前系统共有 %d 名学生。\n", count);
            break;

            /* (高级功能)
            case 8: // 保存数据
                printf("--- [8. 保存数据到文件] ---\n");
                SaveToFile(L, "students.dat");
                printf("保存成功！\n");
                break;
            */

        case 0: // 退出
            printf("\n--- 正在退出系统 ---\n");
            printf("正在释放内存资源...\n");

            // (高级) 退出前自动保存
            // SaveToFile(L, "students.dat"); 

            // (必须) 释放所有内存
            DestroyList(L);

            printf("感谢使用学籍管理系统，再见！\n");
            break;

        default:
            printf("错误: 无效的选择 '%d'，请输入 0 到 7 之间的数字。\n", choice);
            break;
        }

        if (choice != 0) {
            printf("\n按 Enter 键继续...");
            getchar(); // 暂停，等待用户按回车
        }
    }

    return 0; // 退出 main 函数
}